Skip to content

Latest commit

 

History

History
60 lines (46 loc) · 1.76 KB

数组_双指针_88合并两个有序数组.md

File metadata and controls

60 lines (46 loc) · 1.76 KB

题目描述:

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。 示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6]

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0 输出:[1]

提示:

nums1.length == m + n nums2.length == n 0 <= m, n <= 200 1 <= m + n <= 200 -10^9 <= nums1[i], nums2[i] <= 10^9 解题思路:

由于 nums1 数组的长度足够容纳两个数组中的所有元素,因此可以考虑从后往前遍历两个数组,并将较大的元素依次放入 nums1 数组的末尾。

具体实现时,可以定义指针 p1 和 p2 分别指向 nums1 数组和 nums2 数组的有效元素末尾(即不为 0 的最后一个元素),另外再定义一个指针 p3 用于指向 nums1 数组的末尾。

比较 nums1[p1] 和 nums2[p2] 的大小,将较大的数放入 nums1[p3] 的位置,并将对应的指针向前移动。如果其中一个数组遍历完了,那么直接将另一个数组剩余的元素放入 nums1 数组即可。

最后返回修改后的 nums1 数组即可。

时间复杂度:$O(m+n)$。 空间复杂度:$O(1)$。

var merge = function(nums1, m, nums2, n) {
  let p1 = m-1, p2 = n-1, p3 = m+n-1;
  while(p1>=0 && p2>=0){
    if(nums1[p1]>nums2[p2]){
      nums1[p3] = nums1[p1];
      p3--;
      p1--;
    }else{
      nums1[p3] = nums2[p2];
      p3--;
      p2--;
    }
  }
  while(p2>=0){
    nums1[p3] = nums2[p2];
    p3--;
    p2--;
  }
  return nums1;
};